初心者でも安心!Datadog ではじめる AWS Lambda サーバーレスモニタリング
こんにちは。テクニカルサポートチームのShiinaです。
はじめに
サーバーレスアーキテクチャは、スケーラビリティやコスト効率の面で多くのメリットを提供します。
その一方で、アプリケーションのパフォーマンスやトラブルシューティングを行うためのモニタリングは複雑になりがちです。
そんな課題を解決するのが、Datadog の AWS Lambda サーバーレスモニタリングです。
本記事では、Datadog を活用して Lambda 関数をはじめとするサーバーレススタック全体をどのように可視化し、効率的に管理できるかを解説します。
さらに、サンプルアプリケーションを用いて、セットアップの手順や実際のモニタリング画面の使い方を具体的にご紹介します。
サーバレスモニタリングでできること
Datadog はサーバレスアプリケーションからモニタリングに必要な様々な情報をリアルタイムで収集することができます。
・トレース
・Lambda 拡張メトリクス(呼び出し回数、レイテンシ、経過時間、推定コスト、コールドスタートおよびメタデータなど)
・CloudWatchLogs のログ
サポートしているランタイムは以下の通りです。(2025/1/5時点)
・Python
・Node.js
・Ruby
・Java
・Go
・.NET
サーバレスモニタリングのメリット
Datadog のサーバレスモニタリングのメリットとして次の点が挙げられます。
-
アプリケーションの再デプロイ不要でモニタリングをはじめられる
Datadog Lambda Extension を利用してリアルタイムのメトリクス、トレース、ログを Datadog に送信します。
トレースライブラリを Lambda 関数のレイヤーとして追加することで、アプリケーションコードの修正および新しいデプロイを必要とせずに収集をはじめられます。 -
ペイロードを収集できる
リクエストとレスポンスのペイロードを収集することが可能です。
ペイロードのクエリパラメーターに基づいたパフォーマンス調査やデバックが容易になります。 -
サーバレススタック全体をモニタリングできる
Datadog のサーバレスモニタリングは Lambda 以外のリソースに対するメトリクス収集および関連付けを行うことができます。
Lambda イベントに基づいて APM スパンを推測できるため、マネージドサービス間の関連性の可視化やパフォーマンス問題の特定に役立てることができます。
サポートされているマネージドサービスは以下の通りです。(2025/1/5時点)
・Amazon API Gateway
・SNS
・SQS
・DynamoDB
・S3
・EventBridge
・Kinesis
Datadog Lambda Extension とは
Datadog Lambda Extension はカスタムメトリクス、拡張メトリクス、トレース、ログを送信する Datadog Agent の軽量版です。
実体としてはレイヤーであり、サーバレスアプリケーションの Lambda 関数にレイヤーを追加する形で動作します。
Lambda 関数のログを送信するには Datadog Forwarder を利用する方法もありますが、Datadog Lambda Extension を利用して収集することが推奨となっています。
注意点として、コールドスタート時に機能をロードする必要があるため、オーバヘッドが追加されます。
オーバヘッドの大部分は Lambda 関数へのパフォーマンスに影響を与えないものとされていますが、関数のタイムアウト値には注意が必要です。
サーバレスモニタリングの前提
・Datadog API キーが登録されていること
・サーバレスアプリケーションとなる Lambda 関数がデプロイされていること
サンプルアプリケーション
概要
今回、サーバレスモニタリングに使用するサンプルアプリケーションの機能概要は次の通りです。
- API Gateway、DynamoDB、Lambda を利用します。
- POST リクエストパラメータに指定された id および data を DynamoDB テーブルへ書き込みます。
- GET リクエストパラメータに指定された id の data を DynamoDB テーブルから取得します。
リソース
サンプルアプリケーションのリソースは次の通りです。
-
API Gateway
ステージ:dev
リソースパス:/data
GET、POST メソッド:統合リクエストの設定で Lambda 関数「SampleFunction」を指定 -
DynamoDB
テーブル名:SampleTable
属性:id(パーティションキー)、data -
Lambda
関数名:SampleFunction
ランタイム:Python 3.12
import json
import boto3
from botocore.exceptions import ClientError
# DynamoDBクライアントの作成
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('SampleTable') # DynamoDBテーブル名
def lambda_handler(event, context):
http_method = event['httpMethod']
if http_method == 'POST':
# POSTリクエスト: データをDynamoDBに書き込む
try:
body = json.loads(event['body'])
id = body['id']
data = body['data']
# DynamoDBにデータを保存
table.put_item(Item={'id': id, 'data': data})
return {
'statusCode': 200,
'body': json.dumps({'message': 'Data saved successfully'})
}
except Exception as e:
return {
'statusCode': 500,
'body': json.dumps({'error': str(e)})
}
elif http_method == 'GET':
# GETリクエスト: DynamoDBからデータを取得
try:
id = event['queryStringParameters']['id']
# DynamoDBからデータを取得
response = table.get_item(Key={'id': id})
if 'Item' in response:
return {
'statusCode': 200,
'body': json.dumps(response['Item'])
}
else:
return {
'statusCode': 404,
'body': json.dumps({'message': 'Data not found'})
}
except Exception as e:
return {
'statusCode': 500,
'body': json.dumps({'error': str(e)})
}
else:
return {
'statusCode': 400,
'body': json.dumps({'message': 'Unsupported HTTP method'})
}
サーバレスモニタリングのセットアップ方法
サーバレスアプリケーションのインスツルメンテーションを行うために Datadog CLI、Serverless Framework、AWS SAM、AWS CDK などのいくつかのインストール方法が提供されています。
今回は推奨方法である Datadog CLI を EC2 インスタンスにインストールし、セットアップを行います。
1.Datadog API キーのシークレット登録
サーバレスアプリケーションのインスツルメントには DatadogAPI キーを必要とします。
AWS Secrets Manager の利用が推奨されるため、あらかじめシークレットに API キーを登録しておきます。
AWS Secrets Manager メニューのシークレットより、「新しいシークレットを保存する」を選択します。
次のように設定の上、シークレットを登録します。
- シークレットタイプ:その他のシークレットのタイプ
- キー/値のペア:プレーンテキスト
{"":""}をクリアし、Datadog API キーを入力します。 - シークレットの名前
任意の名前を入力します。 - ローテーションを設定
オプションの設定不要です。
2.必要ロールポリシー設定
必要なサービスへのアクセスのため、次のアクセス許可を行うためのポリシーをそれぞれのロールにアタッチします。
- ①Lambda 実行ロール
AWS Secrets Manager のシークレットに対するGetSecretValue
アクションを許可するインラインポリシーを追加します。
ARN は適切な値に修正してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": "arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXX:secret:XXXXXXXXXXXXXXX"
}
]
}
- ②EC2 インスタンスロール
Lambda サービスに対するアクションを許可するマネージドポリシーを追加します。
・AWSLambda_FullAccess
3.Datadog CLI インストール
クライアントを EC2 インスタンスにインストールします。
sudo yum install nodejs -y
npm install -g @datadog/datadog-ci
4.インスツルメンテーション(インタラクティブモード)
慣れない場合はインタラクティブモードを利用し、ステップに従ってインスツルメンテーションすることをお勧めします。
各ステップに従い、インストールを進めていきます。
・リージョン名の入力
・Datadog サイトの選択
・API キーの選択およびシークレットの ARN を入力
・Lambda 関数の選択
・統合サービスタグenv
、service
、version
の値入力
・適用内容の最終確認
datadog-ci lambda instrument -i
インタラクティブモード
Instrumenting Lambda function
[!] Configure AWS region.
? Which AWS region (e.g., us-east-1) your Lambda functions are deployed?
ap-northeast-1
[!] Configure Datadog settings.
? Select the Datadog site to send data.
Learn more at https://docs.datadoghq.com/getting_started/site/
❯ datadoghq.com
? Which type of Datadog API Key you want to set?
Learn more at https://app.datadoghq.com/organization-settings/api-keys AWS Secrets Manager API Key Secret ARN
? API Key Secret ARN: arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXX:secret:XXXXXXXXXXXXXXX
Fetched X Lambda functions.
? Select the functions to modify (Press <space> to select, p.s. start typing the name instead of manually scrolling)
❯◉ SampleFunction
? Enter a value for the environment variable DD_ENV (recommended)
dev
? Enter a value for the environment variable DD_SERVICE (recommended)
sampleapi
? Enter a value for the environment variable DD_VERSION (recommended)
v1.0
Warning] Couldn't add source code integration, continuing without it. Error: Couldn't get local git status.
[ap-northeast-1] Fetched 1 Lambda configurations.
[Warning] Instrument your Lambda functions in a dev or staging environment first. Should the instrumentation result be unsatisfactory, run uninstrument
with the same arguments to revert the changes.
[!] Functions to be updated:
- arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:SampleFunction
[Warning] At least one latest layer version is being used. Ensure to lock in versions for production applications using --layerVersion
and --extensionVersion
.
Will apply the following updates:
UpdateFunctionConfiguration -> arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:SampleFunction
{
"FunctionName": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:SampleFunction",
"Handler": "datadog_lambda.handler.handler",
"Environment": {
"Variables": {
"DD_LAMBDA_HANDLER": "lambda_function.lambda_handler",
"DD_API_KEY_SECRET_ARN": "arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXX:secret:XXXXXXXXXXXXXXX",
"DD_SITE": "datadoghq.com",
"DD_SERVERLESS_APPSEC_ENABLED": "false",
"DD_CAPTURE_LAMBDA_PAYLOAD": "false",
"DD_ENV": "dev",
"DD_MERGE_XRAY_TRACES": "false",
"DD_SERVICE": "sampleapi",
"DD_TRACE_ENABLED": "true",
"DD_VERSION": "v1.0",
"DD_FLUSH_TO_LOG": "true"
}
},
"Layers": [
"arn:aws:lambda:ap-northeast-1:464622532012:layer:Datadog-Extension:67",
"arn:aws:lambda:ap-northeast-1:464622532012:layer:Datadog-Python312:104"
]
}
TagResource -> arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:SampleFunction
{
"dd_sls_ci": "v2.46.2"
}
[!] Confirmation needed.
? Do you want to apply the changes? (Y/n)
Y
[!] Instrumenting functions.
[ap-northeast-1] Updated 1 Lambda function.
Updated 1 Lambda function.
4.インスツルメンテーション(コマンド引数)
引数を指定したinstrument
コマンドを実行することでもインスツルメンテーションが可能です。
引数 | 設定値の例 | 説明 |
---|---|---|
-f | arn:aws:lambda:XXXXX | Lambda関数の ARN |
-v | 104 | datadog-lambda-python のバージョン[1] |
-e | 67 | datadog-lambda-extension のバージョン[2] |
--service | sampleapi | service タグの値 |
--version | v1.0 | version タグの値 |
--env | dev | env タグの値 |
DATADOG_API_KEY_SECRET_ARN
および DATADOG_SITE
は export
コマンドで OS の環境変数にセットした上で実行します。
export DATADOG_API_KEY_SECRET_ARN="arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXX:secret:XXXXXXXXXXXXXXX"
export DATADOG_SITE="datadoghq.com"
datadog-ci lambda instrument -f arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:SampleFunction -v 104 -e 67 --service sampleapi --version v1.0 --env dev
Instrumenting Lambda function
(中略)
[ap-northeast-1] Updated 1 Lambda function.
Updated 1 Lambda function.
5.Lambda 関数のインスツルメンテーション確認
Lambda サービスメニューの関数より、該当の関数名を選択します。
コードタブにて2つのレイヤーが追加されていることを確認します。
・Datadog-Extension
・Datadog-Python312
設定タブにて環境変数が追加されていることを確認します。
(オプション)アンインスツルメンテーション
動作や結果が想定と異なる場合は、uninstrument
コマンドを実行することで、変更を元に戻すことができます。
datadog-ci lambda uninstrument -f arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:SampleFunction --region ap-northeast-1
Uninstrumenting Lambda function
[ap-northeast-1] Fetched 1 Lambda configurations.
(中略)
Updated 1 Lambda function.
サーバーレスモニタリング
Datadog コンソールよりサーバレスアプリケーションのメトリクス、トレース、ログの確認を行います。
メトリクス確認
infrastructure の Serverless を選択します。
インスツルメンテーションを行なった Lambda 関数が呼び出されると INVOCATIONS、DURATION、ERRORS の値とサマリーグラフが表示されます。
Emitting Enhanced Metrics を選択します。
Cold Start、Init Duration、Timeouts、Out of Memory Errors メトリクスの確認が行えます。
トレース確認
Emitting Traces を選択します。
Invocations 一覧が表示されます。
リクエストにより呼び出された Lambda 関数の DATE、DURATION、TRIGGER、ERROR、TRACE が可視化されます。
Invocations の Open Trace を選択します。
Flame Graph タブではスパンごとのタイムフレームが確認できます。
また、スパン属性の値も確認することが可能です。
Map タブを選択します。
Lambda と DynamoDB 間の関連性が可視化されます。
また、パフォーマンスも確認できます。
ログ確認
Emitting logs を選択します。
CloudWatch Logs に出力されたログが確認できます。
一覧よりログメッセージを選択し、Trace タブの View Trace In APM を選択します。
trace_id と紐づいているため、ログからトレースを確認できます。
ダッシュボード確認
Datadog では Lambda 拡張メトリクスの主要メトリクスが一目で確認できるダッシュボードが用意されています。
Dashboards の Dashboards List を選択します。
検索フィールドに aws lambda
と入力し、AWS Lambda (Enhanced Metrics) を選択します。
ダッシュボードにより拡張メトリクスのグラフや値が可視化されます。
リクエストとレスポンスのペイロード収集方法
Datadog は AWS Lambda 関数の JSON リクエストとレスポンスのペイロードを収集できます。
ペイロードを可視化することで、サーバーレスアプリケーションのデバックやトラブルシューティングが可能となります。
ペイロード収集はデフォルトでは無効となっているため、有効化を行う必要があります。
ペイロード収集の有効化
追加引数 --capture-lambda-payload true
を指定して instrument
コマンドを実行します。
export DATADOG_API_KEY_SECRET_ARN="arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXX:secret:XXXXXXXXXXXXXXX"
export DATADOG_SITE="datadoghq.com"
datadog-ci lambda instrument -f arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:SampleFunction -v 104 -e 67 --service sampleapi --version v1.0 --env dev --capture-lambda-payload true
Instrumenting Lambda function
[Warning] Couldn't add source code integration, continuing without it. Error: Couldn't get local git status.
[ap-northeast-1] Fetched 1 Lambda configurations.
(中略)
[ap-northeast-1] Updated 1 Lambda function.
Updated 1 Lambda function.
Lambda 関数の環境変数確認
Lambda サービスメニューの関数より、該当の関数名を選択します。
設定タブにて次の環境変数が設定されていることを確認します。
・キー:DD_CAPTURE_LAMBDA_PAYLOAD
・値:true
POST リクエストのトレース
API Gateway のエンドポイントに対して POST リクエストを行ってみます。
curl -X POST \
-H "Content-Type: application/json" \
-d '{"id": "111", "data": "Sample data"}' \
"https://{api-id}.execute-api.{region}.amazonaws.com/{stage}/{path}"
{"message": "Data saved successfully"}
リクエストとレスポンスペイロードの確認
infrastructure の Serverless を選択します。
Emitting Traces を選択します。
Invocations 一覧が表示されます。
該当の POST リクエスト Invocations の Open Trace を選択します。
-
リクエストペイロード
Lambda Request 属性が追加されています。
@function.request.body.data:"Sample data"
@function.request.body.id:111
-
レスポンスペイロード
Lambda Responce 属性が追加されています。
@function.response.body.message:"Data saved successfully"
GET リクエストのトレース
API Gateway のエンドポイントに対して GET リクエストを行ってみます。
curl "https://{api-id}.execute-api.{region}.amazonaws.com/{stage}/{path}?id=111"
{"id": "111", "data": "Sample data"}
リクエストとレスポンスペイロードの確認
infrastructure の Serverless を選択します。
Emitting Traces を選択します。
Invocations 一覧が表示されます。
該当の GET リクエスト Invocations の Open Trace を選択します。
-
リクエストペイロード
Lambda Request 属性が追加されています。
@function.request.queryStringParameters.id:111
-
レスポンスペイロード
Lambda Responce 属性が追加されています。
@function.response.body.data:"Sample data"
@function.response.body.id:111
まとめ
本記事では、Datadog のサーバーレスモニタリング機能について、Python で実装したサンプルアプリケーションを用いて解説しました。
Datadog CLI によるインスツルメンテーションにより、アプリケーションの再デプロイなしでモニタリングを開始できます。
また、メトリクス、トレース、ログをリアルタイムに収集・確認が可能です。
リクエストとレスポンスのペイロード収集を有効化することで、より詳細なデバッグやトラブルシューティングが可能となります。
Datadog のサーバーレスモニタリングを活用することで、Lambda を含むサーバーレススタック全体の可視性を向上させ、効率的な運用管理を実現できます。
本記事が誰かのお役に立てれば幸いです。
参考